// 引入 Web3 库，Web3 是一个 JavaScript 库，提供了与 Ethereum 兼容的 JavaScript 对象，可以在浏览器和 Node.js 中使用
import Web3 from "web3";

// 创建一个 getWeb3 函数，返回一个 Promise 对象。这个函数的目的是获取一个 Web3 实例
const getWeb3 = () =>
    new Promise((resolve, reject) => {
        // 当浏览器窗口加载完成时，执行以下异步操作
        window.addEventListener("load", async () => {
            let web3;
            
            // 检查浏览器环境是否已经注入了 Ethereum 提供者（即 MetaMask 插件等）
            if (window.ethereum) {
                // 如果存在 Ethereum 提供者，创建一个新的 Web3 实例并使用 Ethereum 提供者
                web3 = new Web3(window.ethereum);
                try {
                    // 请求用户让 Dapp 访问他们的账户，即向用户获取权限
                    await window.ethereum.enable();
                } catch (error) {
                    // 如果用户拒绝了访问请求，Promise 被拒绝
                    reject(error);
                }
            }
            // 检查浏览器环境是否已经注入了 web3 实例（比如旧版的 MetaMask 插件）
            else if (window.web3) {
                // 如果存在 web3 实例，使用这个实例的 provider 创建一个新的 web3 实例
                web3 = new Web3(window.web3.currentProvider);
                console.log("Injected web3 detected.");
            }
            // 如果浏览器环境没有注入 Ethereum 提供者或 web3 实例
            else {
                // 连接到运行在本地的 Ethereum 节点（这里是 Ganache），创建一个新的 web3 实例
                const provider = new Web3.providers.HttpProvider("http://localhost:7545");
                web3 = new Web3(provider);
                console.log("No web3 instance injected, using Local web3.");
            }
            
            // 获得当前连接的网络ID
            const networkId = await web3.eth.net.getId();
            // 检查网络ID，如果不是预期的网络（这里预期的网络ID是5777，Ganache 默认的网络ID），则发出警告
            if (networkId !== 5777) {
                alert("请切换网络到 LoveOnChain");
            }
            
            // 最后，当 web3 实例已经准备就绪时，将它作为 Promise 的解决值返回
            resolve(web3);
        });
    });

// 将 getWeb3 函数作为默认导出，这样其他文件可以导入这个函数
export default getWeb3;
